package day15;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.PriorityQueue;

/**
 * @author ZJX
 * @version 1.0
 * @descption
 * @since 2025/10/26 17:15
 */
public class Day09 {
    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\."); // 转义
        String[] v2 = version2.split("\\."); // 转义
        int maxLen = Math.max(v1.length, v2.length);
        for (int i = 0; i < maxLen; i++) {
            int n1 = i < v1.length ? Integer.parseInt(v1[i]) : 0;
            int n2 = i < v2.length ? Integer.parseInt(v2[i]) : 0;
            if (n1 > n2) {
                return 1;
            } else if (n2 > n1) {
                return -1;
            }
        }
        return 0;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(System.out);
        int n = Integer.parseInt(in.readLine().trim()); // 字符串长度
        String s = in.readLine().trim(); // 字符串
        int[] map = new int[26];
        // 统计每个字符出现的次数, 因为是26个字母所以用数组更好
        for (char ch : s.toCharArray()) {
            map[ch - 'a']++;
        }
        int max = 0;
        for (int x : map) {
            max = Math.max(max, x);
        }
        if (max > (n + 1) / 2) {
            out.println("no");
            out.close();
            return;
        }
        PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> b[0] - a[0]); // 降序排列
        for (int i = 0; i < 26; i++) {
            if (map[i] > 0) {
                heap.add(new int[]{map[i], i + 'a'}); // [次数,字符]
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        while (heap.size() >= 2) {
            int[] first = heap.poll();
            int[] second = heap.poll();
            stringBuilder.append((char) first[1]);
            stringBuilder.append((char) second[1]);
            if (--first[0] > 0) {
                heap.add(first);
            }
            if (--second[0] > 0) {
                heap.add(second);
            }
        }
//        取出最后一个字符
        if (!heap.isEmpty()) {
            stringBuilder.append((char) heap.poll()[1]);
        }
        out.println("yes");
        out.println(stringBuilder);
        out.close();
    }

    /**
     * 最长无重复子数组的和
     *
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength(int[] arr) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int left = 0;
        int ret = 0;
        for (int i = 0; i < arr.length; i++) {
            if (map.containsKey(arr[i])) {
                left = Math.max(left, map.get(arr[i]) + 1);
            }
            map.put(arr[i], i);
            ret = Math.max(ret, i - left + 1);
        }
        return ret;
    }

    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        int m = num1.length(), n = num2.length();
        int[] ret = new int[m + n];
        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = num1.charAt(i) - '0' * num2.charAt(j) - '0';
                int p1 = i + j, p2 = i + j + 1;
                int sum = mul + ret[p2];
                ret[p2] = sum % 10;
                ret[p1] = sum / 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int x : ret) {
            if (!(x == 0 && sb.length() == 0)) {
                sb.append(x);
            }
        }
        return sb.toString();
    }
}

